;保护模式下GDT,LDT,IDT相关宏

; 一、 GDT与LDT描述符

; type类型很复杂，1-3位
; 当描述符为存储描述符时
; 0到7属于数据段
PT_DA_R		EQU	00h	; 0	只读  
PT_DA_RA	EQU	01h	; 1	只读、已访问 
PT_DA_RW	EQU	02h	; 2	读/写 
PT_DA_RWA	EQU	03h	; 3	读/写、已访问 
PT_DA_RD	EQU	04h	; 4	只读、向下扩展 
PT_DA_RDA	EQU	05h	; 5	只读、向下扩展、已访问 
PT_DA_RWD	EQU	06h	; 6	读/写、向下扩展 
PT_DA_RWDA	EQU	07h	; 7	读/写、向下扩展、已访问 
; 8到F属于代码段
PT_CD_E		EQU	08h	; 8	只执行 
PT_CD_EA	EQU	09h	; 9	只执行、已访问 
PT_CD_ER	EQU	0ah	; A	执行/读 
PT_CD_ERA	EQU	0bh	; B	执行/读、已访问 
PT_CD_ES	EQU	0ch	; C	只执行、一致码段 
PT_CD_ESA	EQU	0dh	; D	只执行、一致码段、已访问 
PT_CD_ERS	EQU	0eh	; E	执行/读、一致码段 
PT_CD_ERSA	EQU	0fh	; F	执行/读、一致码段、已访问 
; 当描述符为系统述符时
					; 0 未定义
PT_T_286TSS		EQU	01h	; 1	可用286TSS
PT_T_LDT		EQU	02h	; 2	LDT
PT_T_286TSS_B	EQU	03h	; 3	忙的286TSS
PT_T_286CA		EQU	04h	; 4	286调用门
PT_T_DU			EQU	05h	; 5	任务门
PT_T_286INT		EQU	06h	; 6	286中断门
PT_T_286TRA		EQU	07h	; 7	286陷阱门
						; 8	未定义
PT_T_386TSS		EQU	09h	; 9	可用386TSS
						; A	<未定义>
PT_T_386TSS_B	EQU	0bh	; B	忙的386TSS
PT_T_386CA		EQU	0ch	; C	386调用门
						; D	<未定义>
PT_T_386INT		EQU	0eh	; E	386中断门
PT_T_386TRA		EQU	0fh	; F	386陷阱门


; 说明描述符的类型，4位
; 对于存储段描述符而言，S=1，以区别与系统段描述符和门描述符(S=0)。 
; 两种系统段：任务状态段TSS和局部描述符表LDT段。
PT_S_SYS	EQU	00h	; 系统描述符
PT_S		EQU	10h	; 存储段描述符	

; 特权级，5、6位，DPL
PT_DPL_0	EQU	00h ; DPL = 0 最高特权
PT_DPL_1	EQU	20h
PT_DPL_2	EQU	40h
PT_DPL_3	EQU	60h

; present,7位
; 1表示所描述的段存在(有效),为0表示所描述的段无效,使用该描述符会引起异常
PT_P_INVALID	EQU	00h
PT_P_VALID		EQU	80h

; AVL: 软件可利用位,12位。

; D位，14位
; ⑴ 在描述可执行段的描述符中，D位决定了指令使用的地址及操作数所默认的大小。
;	① D=1表示默认情况下指令使用32位地址及32位或8位操作数，这样的代码段也称为32位代码段；
;	② D=0 表示默认情况下，使用16位地址及16位或8位操作数，这样的代码段也称为16位代码段，
;      它与80286兼容。可以使用地址大小前缀和操作数大小前缀分别改变默认的地址或操作数的大小。
PT_D_16		EQU	00h		; 16 位代码段 
PT_D_32		EQU	4000h	; 32 位代码段
; ⑵ 在向下扩展数据段的描述符中，D位决定段的上部边界。
;	① D=1表示段的上部界限为4G；
;	② D=0表示段的上部界限为64K，这是为了与80286兼容。 
PT_D_64K	EQU	00h
PT_D_4G		EQU	4000h
; ⑶ 在描述由SS寄存器寻址的段描述符中，D位决定隐式的堆栈访问指令(如PUSH和POP指令)使用何种堆栈指针寄存器。
;	① D=1表示使用32位堆栈指针寄存器ESP；
;	② D=0表示使用16位堆栈指针寄存器SP，这与80286兼容。 
PT_D_SP		EQU	00h
PT_D_ESP	EQU	4000h

; G: 段界限粒度(Granularity),15位。
; G=0 表示界限粒度为字节；
; G=1 表示界限粒度为4K 字节。
; 注意，界限粒度只对段界限有效，对段基地址无效，段基地址总是以字节为单位。 
PT_G_BYTE	EQU	00h
PT_G_4K		EQU	8000h

; 构建描述符的宏，参考了于渊老师的《自动手写操作系统》，感谢老师
; 有三个参数：【段基址】、【段界限】、【段属性】
%macro Descriptor 3
	dw	%2 & 0FFFFh				; 段界限1
	dw	%1 & 0FFFFh				; 段基址1
	db	(%1 >> 16) & 0FFh			; 段基址2
	dw	((%2 >> 8) & 0F00h) | (%3 & 0F0FFh)	; 属性1 + 段界限2 + 属性2
	db	(%1 >> 24) & 0FFh			; 段基址3
%endmacro ; 共 8 字节

; 二、选择子参数
SA_RPL0		EQU	0	; 
SA_RPL1		EQU	1	; RPL
SA_RPL2		EQU	2	; 
SA_RPL3		EQU	3	; 
